package br.ucb.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ucb.dao.ClienteDAO;
import br.ucb.entidade.Cliente;

public class ClienteDAOImpl extends AbstractEntidadeDAO<Cliente> implements ClienteDAO{

	@Override
	protected List<Object> doPreparedStatement(Cliente entidade,StringBuffer query) {
		List<Object> args = new ArrayList<Object>();
		
		if(entidade.getCpf()!=null){
			query.append(" AND cpf = ?");
			args.add(entidade.getCpf());
		}		
		if(entidade.getNome()!=null){
			query.append(" AND nome LIKE '%?%'");
			args.add(entidade.getNome());
		}
		if(entidade.getEndereco()!=null){
			query.append(" AND endereco LIKE '%?%'");
			args.add(entidade.getEndereco());
		}
		if(entidade.getTelefone()!=null){
			query.append(" AND telefone = ?");
			args.add(entidade.getTelefone());
		}
		if(entidade.getEmail()!=null){
			query.append(" AND email LIKE '%?%'");
			args.add(entidade.getEmail());
		}
		if(entidade.getEmDia()!=null){
			query.append(" AND emdia = ?");
			args.add(entidade.getEmDia());
		}
		
		query.append(";");
		
		return args;
	}

	@Override
	protected List<Cliente> retornaListaEntidades(ResultSet resultado) {
		List<Cliente> lista = new ArrayList<Cliente>();
		try {
			while(resultado.next()){
				lista.add(new Cliente(resultado.getString(1),resultado.getString(2),resultado.getString(3),resultado.getString(4),
						resultado.getString(5),resultado.getInt(6)));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return lista;
	}

	@Override
	protected String getTableValues(Cliente entidade) {
		StringBuffer query = new StringBuffer();
		if(entidade.getCpf()!=null){
			query.append("cpf,");
		}		
		if(entidade.getNome()!=null){
			query.append("nome,");
		}
		if(entidade.getEndereco()!=null){
			query.append("endereco,");
		}
		if(entidade.getTelefone()!=null){
			query.append("telefone,");
		}
		if(entidade.getEmail()!=null){
			query.append("email,");
		}
		if(entidade.getEmDia()!=null){
			query.append("emdia");
		}
		if(query.charAt(query.length()-1)==',')
			query.deleteCharAt(query.length()-1);
		return query.toString();
	}

	@Override
	protected List<Object> getInsertValues(Cliente entidade, StringBuffer sql) {
		List<Object> args = new ArrayList<Object>();
		
		if(entidade.getCpf()!=null){
			sql.append("?,");
			args.add(entidade.getCpf());
		}		
		if(entidade.getNome()!=null){
			sql.append("?,");
			args.add(entidade.getNome());
		}
		if(entidade.getEndereco()!=null){
			sql.append("?,");
			args.add(entidade.getEndereco());
		}
		if(entidade.getTelefone()!=null){
			sql.append("?,");
			args.add(entidade.getTelefone());
		}
		if(entidade.getEmail()!=null){
			sql.append("?,");
			args.add(entidade.getEmail());
		}
		if(entidade.getEmDia()!=null){
			sql.append("?,");
			args.add(entidade.getEmDia());
		}
		
		if(sql.charAt(sql.length()-1)==',')
			sql.deleteCharAt(sql.length()-1);
		
		return args;
	}

	@Override
	protected String doUpdate(Cliente entidade, List<Object> args) {
		StringBuffer update = new StringBuffer("update cliente set");
		
		if(entidade.getCpf()!=null){
			update.append(" cpf = ?,");
			args.add(entidade.getCpf());
		}		
		if(entidade.getNome()!=null){
			update.append(" nome = ?,");
			args.add(entidade.getNome());
		}
		if(entidade.getEndereco()!=null){
			update.append(" endereco = ?,");
			args.add(entidade.getEndereco());
		}
		if(entidade.getTelefone()!=null){
			update.append(" telefone = ?,");
			args.add(entidade.getTelefone());
		}
		if(entidade.getEmail()!=null){
			update.append(" email = ?,");
			args.add(entidade.getEmail());
		}
		if(entidade.getEmDia()!=null){
			update.append(" emdia = ?,");
			args.add(entidade.getEmDia());
		}
		if(update.charAt(update.length()-1)==',')
			update.deleteCharAt(update.length()-1);
		
		update.append(" where cpf = ?;");
		args.add(entidade.getCpf());
		
		return update.toString();
	}

	@Override
	protected void setTable() {
		super.table = "cliente";
	}

	@Override
	protected Cliente retornaEntidades(ResultSet resultado) {
		Cliente cliente=null;
		try {
			while(resultado.next()){
				cliente = new Cliente(resultado.getString(1), resultado.getString(2), resultado.getString(3), resultado.getString(4), resultado.getString(5), resultado.getInt(6));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cliente;
	}
}
